package nb.diskfilesystem;

import java.util.List;

public class Directory_Node {
    private byte[] file_Name= new  byte[3];      //文件名字   3字节
    private byte[] back_name= new byte[2];      //文件类型后缀名也就是txt    2字节   目录为空格
    private byte attribute= '\0';        //文件属性     //等于8说明是文件夹，等于4说明是文件     //1字节
    private byte startBlock= '\0';       //起始盘块号        1字节
    private byte length= '\0';     //题目中说为了实验简单，文件长度为盘块数   1字节   目录为0
    private Directory_Node Parent;
    private List<Directory_Node> Childrens;

    private  String path= "";

    public  Directory_Node(){
    }

    // 创建DirectoryEntry对象：传入一个盘块，和你要生成对象的目录项的下标
    public Directory_Node(byte[] buffer, int index)
    {
        //通过读取文件的前三个字节，来生成文件名
        this.file_Name = new byte[]
                { buffer[index * 8 + 0], buffer[index * 8 + 1], buffer[index * 8 + 2] };
        //通过读取文件的后两个字节，来生成后缀名
        this.back_name = new byte[]
                { buffer[index * 8 + 3], buffer[index * 8 + 4] };
        //通过读取文件的第五个字节，来生成文件属性
        this.attribute = buffer[index * 8 + 5];
        //文件的第六个字节，表示文件盘块号
        this.startBlock = buffer[index * 8 + 6];
        //文件的第七个字节，表示文件长度，目录长度为0
        this.length = buffer[index * 8 + 7];
    }

    public Directory_Node(byte[] buffer)
    {
        //通过读取文件的前三个字节，来生成文件名
        this.file_Name = new byte[]
                { buffer[0], buffer[1], buffer[2] };
        //通过读取文件的后两个字节，来生成文件类型txt   文件夹的话为空格
        this.back_name = new byte[]
                { buffer[3], buffer[4] };
        //通过读取文件的第五个字节，来生成文件属性
        this.attribute = buffer[5];
        //文件的第六个字节，表示文件盘块号
        this.startBlock = buffer[6];
        //文件的第七个字节，表示文件长度，目录长度为设置为0  文件长度设置为盘块数
        this.length = buffer[7];
    }

    public byte[] getFile_Name() {
        return file_Name;
    }

    public void setFile_Name(byte[] file_Name) {
        int i=0;
        for( i=0;i<file_Name.length;i++){
            if(i>=3){
                break;
            }
            this.file_Name[i]=file_Name[i];
        }
        for(;i<3;i++){
            this.file_Name[i]=0;
        }
    }

    public byte[] getBack_name() {
        return back_name;
    }

    public void setBack_name(byte[] back_name) {
        int i=0;
        for( i=0;i<file_Name.length;i++){
            if(i>=2){
                break;
            }
            this.file_Name[i]=file_Name[i];
        }
        for(;i<2;i++){
            this.file_Name[i]=0;
        }
    }

    public byte getAttribute() {
        return attribute;
    }

    public void setAttribute(byte attribute) {
        this.attribute = attribute;
    }

    public byte getStartBlock() {
        return startBlock;
    }

    public void setStartBlock(byte startBlock) {
        this.startBlock = startBlock;
    }

    public byte getLength() {
        return length;
    }

    public void setLength(byte length) {
        this.length = length;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public Directory_Node getParent() {
        return Parent;
    }

    public void setParent(Directory_Node parent) {
        Parent = parent;
    }

    public List<Directory_Node> getChildrens() {
        return Childrens;
    }

    public void setChildrens(List<Directory_Node> childrens) {
        Childrens = childrens;
    }

    public byte[] toByteArray() {
        // 创建一个字节数组，长度为所有字段长度之和
        byte[] nodeData = new byte[3 + 2 + 1 + 1 + 1]; // file_Name(3) + back_name(2) + attribute(1)
        // + startBlock(1) + length(1)
        // 初始化一个索引，用于跟踪字节数组中的位置
        int index = 0;
        // 复制文件名到字节数组
        System.arraycopy(this.file_Name, 0, nodeData, index, this.file_Name.length);
        index += this.file_Name.length;
        // 复制后缀名到字节数组
        System.arraycopy(this.back_name, 0, nodeData, index, this.back_name.length);
        index += this.back_name.length;
        // 复制属性到字节数组
        nodeData[index] = this.attribute;
        index++;
        // 复制起始盘块号到字节数组
        nodeData[index] = this.startBlock;
        index++;
        // 复制文件长度到字节数组
        nodeData[index] = this.length;
        return nodeData;
    }
}
